home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 5 / FLEX_2_3 / FLEXDOC.1 < prev   
Text File  |  1991-08-06  |  65KB  |  2,447 lines

  1. .TH FLEX 1 "26 May 1990" "Version 2.3"
  2. .SH NAME
  3. flex - fast lexical analyzer generator
  4. .SH SYNOPSIS
  5. .B flex
  6. .B [-bcdfinpstvFILT8 -C[efmF] -Sskeleton]
  7. .I [filename ...]
  8. .SH DESCRIPTION
  9. .I flex
  10. is a tool for generating
  11. .I scanners:
  12. programs which recognized lexical patterns in text.
  13. .I flex
  14. reads
  15. the given input files, or its standard input if no file names are given,
  16. for a description of a scanner to generate.  The description is in
  17. the form of pairs
  18. of regular expressions and C code, called
  19. .I rules.  flex
  20. generates as output a C source file,
  21. .B lex.yy.c,
  22. which defines a routine
  23. .B yylex().
  24. This file is compiled and linked with the
  25. .B -lfl
  26. library to produce an executable.  When the executable is run,
  27. it analyzes its input for occurrences
  28. of the regular expressions.  Whenever it finds one, it executes
  29. the corresponding C code.
  30. .SH SOME SIMPLE EXAMPLES
  31. .LP
  32. First some simple examples to get the flavor of how one uses
  33. .I flex.
  34. The following
  35. .I flex
  36. input specifies a scanner which whenever it encounters the string
  37. "username" will replace it with the user's login name:
  38. .nf
  39.  
  40.     %%
  41.     username    printf( "%s", getlogin() );
  42.  
  43. .fi
  44. By default, any text not matched by a
  45. .I flex
  46. scanner
  47. is copied to the output, so the net effect of this scanner is
  48. to copy its input file to its output with each occurrence
  49. of "username" expanded.
  50. In this input, there is just one rule.  "username" is the
  51. .I pattern
  52. and the "printf" is the
  53. .I action.
  54. The "%%" marks the beginning of the rules.
  55. .LP
  56. Here's another simple example:
  57. .nf
  58.  
  59.         int num_lines = 0, num_chars = 0;
  60.  
  61.     %%
  62.     \\n    ++num_lines; ++num_chars;
  63.     .     ++num_chars;
  64.  
  65.     %%
  66.     main()
  67.         {
  68.         yylex();
  69.         printf( "# of lines = %d, # of chars = %d\\n",
  70.                 num_lines, num_chars );
  71.         }
  72.  
  73. .fi
  74. This scanner counts the number of characters and the number
  75. of lines in its input (it produces no output other than the
  76. final report on the counts).  The first line
  77. declares two globals, "num_lines" and "num_chars", which are accessible
  78. both inside
  79. .B yylex()
  80. and in the
  81. .B main()
  82. routine declared after the second "%%".  There are two rules, one
  83. which matches a newline ("\\n") and increments both the line count and
  84. the character count, and one which matches any character other than
  85. a newline (indicated by the "." regular expression).
  86. .LP
  87. A somewhat more complicated example:
  88. .nf
  89.  
  90.     /* scanner for a toy Pascal-like language */
  91.  
  92.     %{
  93.     /* need this for the call to atof() below */
  94.     #include <math.h>
  95.     %}
  96.  
  97.     DIGIT    [0-9]
  98.     ID       [a-z][a-z0-9]*
  99.  
  100.     %%
  101.  
  102.     {DIGIT}+    {
  103.                 printf( "An integer: %s (%d)\\n", yytext,
  104.                         atoi( yytext ) );
  105.                 }
  106.  
  107.     {DIGIT}+"."{DIGIT}*        {
  108.                 printf( "A float: %s (%g)\\n", yytext,
  109.                         atof( yytext ) );
  110.                 }
  111.  
  112.     if|then|begin|end|procedure|function        {
  113.                 printf( "A keyword: %s\\n", yytext );
  114.                 }
  115.  
  116.     {ID}        printf( "An identifier: %s\\n", yytext );
  117.  
  118.     "+"|"-"|"*"|"/"   printf( "An operator: %s\\n", yytext );
  119.  
  120.     "{"[^}\\n]*"}"     /* eat up one-line comments */
  121.  
  122.     [ \\t\\n]+          /* eat up whitespace */
  123.  
  124.     .           printf( "Unrecognized character: %s\\n", yytext );
  125.  
  126.     %%
  127.  
  128.     main( argc, argv )
  129.     int argc;
  130.     char **argv;
  131.         {
  132.         ++argv, --argc;  /* skip over program name */
  133.         if ( argc > 0 )
  134.                 yyin = fopen( argv[0], "r" );
  135.         else
  136.                 yyin = stdin;
  137.         
  138.         yylex();
  139.         }
  140.  
  141. .fi
  142. This is the beginnings of a simple scanner for a language like
  143. Pascal.  It identifies different types of
  144. .I tokens
  145. and reports on what it has seen.
  146. .LP
  147. The details of this example will be explained in the following
  148. sections.
  149. .SH FORMAT OF THE INPUT FILE
  150. The
  151. .I flex
  152. input file consists of three sections, separated by a line with just
  153. .B %%
  154. in it:
  155. .nf
  156.  
  157.     definitions
  158.     %%
  159.     rules
  160.     %%
  161.     user code
  162.  
  163. .fi
  164. The
  165. .I definitions
  166. section contains declarations of simple
  167. .I name
  168. definitions to simplify the scanner specification, and declarations of
  169. .I start conditions,
  170. which are explained in a later section.
  171. .LP
  172. Name definitions have the form:
  173. .nf
  174.  
  175.     name definition
  176.  
  177. .fi
  178. The "name" is a word beginning with a letter or an underscore ('_')
  179. followed by zero or more letters, digits, '_', or '-' (dash).
  180. The definition is taken to begin at the first non-white-space character
  181. following the name and continuing to the end of the line.
  182. The definition can subsequently be referred to using "{name}", which
  183. will expand to "(definition)".  For example,
  184. .nf
  185.  
  186.     DIGIT    [0-9]
  187.     ID       [a-z][a-z0-9]*
  188.  
  189. .fi
  190. defines "DIGIT" to be a regular expression which matches a
  191. single digit, and
  192. "ID" to be a regular expression which matches a letter
  193. followed by zero-or-more letters-or-digits.
  194. A subsequent reference to
  195. .nf
  196.  
  197.     {DIGIT}+"."{DIGIT}*
  198.  
  199. .fi
  200. is identical to
  201. .nf
  202.  
  203.     ([0-9])+"."([0-9])*
  204.  
  205. .fi
  206. and matches one-or-more digits followed by a '.' followed
  207. by zero-or-more digits.
  208. .LP
  209. The
  210. .I rules
  211. section of the
  212. .I flex
  213. input contains a series of rules of the form:
  214. .nf
  215.  
  216.     pattern   action
  217.  
  218. .fi
  219. where the pattern must be unindented and the action must begin
  220. on the same line.
  221. .LP
  222. See below for a further description of patterns and actions.
  223. .LP
  224. Finally, the user code section is simply copied to
  225. .B lex.yy.c
  226. verbatim.
  227. It is used for companion routines which call or are called
  228. by the scanner.  The presence of this section is optional;
  229. if it is missing, the second
  230. .B %%
  231. in the input file may be skipped, too.
  232. .LP
  233. In the definitions and rules sections, any
  234. .I indented
  235. text or text enclosed in
  236. .B %{
  237. and
  238. .B %}
  239. is copied verbatim to the output (with the %{}'s removed).
  240. The %{}'s must appear unindented on lines by themselves.
  241. .LP
  242. In the rules section,
  243. any indented or %{} text appearing before the
  244. first rule may be used to declare variables
  245. which are local to the scanning routine and (after the declarations)
  246. code which is to be executed whenever the scanning routine is entered.
  247. Other indented or %{} text in the rule section is still copied to the output,
  248. but its meaning is not well-defined and it may well cause compile-time
  249. errors (this feature is present for
  250. .I POSIX
  251. compliance; see below for other such features).
  252. .LP
  253. In the definitions section, an unindented comment (i.e., a line
  254. beginning with "/*") is also copied verbatim to the output up
  255. to the next "*/".  Also, any line in the definitions section
  256. beginning with '#' is ignored, though this style of comment is
  257. deprecated and may go away in the future.
  258. .SH PATTERNS
  259. The patterns in the input are written using an extended set of regular
  260. expressions.  These are:
  261. .nf
  262.  
  263.     x          match the character 'x'
  264.     .          any character except newline
  265.     [xyz]      a "character class"; in this case, the pattern
  266.                  matches either an 'x', a 'y', or a 'z'
  267.     [abj-oZ]   a "character class" with a range in it; matches
  268.                  an 'a', a 'b', any letter from 'j' through 'o',
  269.                  or a 'Z'
  270.     [^A-Z]     a "negated character class", i.e., any character
  271.                  but those in the class.  In this case, any
  272.                  character EXCEPT an uppercase letter.
  273.     [^A-Z\\n]   any character EXCEPT an uppercase letter or
  274.                  a newline
  275.     r*         zero or more r's, where r is any regular expression
  276.     r+         one or more r's
  277.     r?         zero or one r's (that is, "an optional r")
  278.     r{2,5}     anywhere from two to five r's
  279.     r{2,}      two or more r's
  280.     r{4}       exactly 4 r's
  281.     {name}     the expansion of the "name" definition
  282.                (see above)
  283.     "[xyz]\\"foo"
  284.                the literal string: [xyz]"foo
  285.     \\X         if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v',
  286.                  then the ANSI-C interpretation of \\x.
  287.                  Otherwise, a literal 'X' (used to escape
  288.                  operators such as '*')
  289.     \\123       the character with octal value 123
  290.     \\x2a       the character with hexadecimal value 2a
  291.     (r)        match an r; parentheses are used to override
  292.                  precedence (see below)
  293.  
  294.  
  295.     rs         the regular expression r followed by the
  296.                  regular expression s; called "concatenation"
  297.  
  298.  
  299.     r|s        either an r or an s
  300.  
  301.  
  302.     r/s        an r but only if it is followed by an s.  The
  303.                  s is not part of the matched text.  This type
  304.                  of pattern is called as "trailing context".
  305.     ^r         an r, but only at the beginning of a line
  306.     r$         an r, but only at the end of a line.  Equivalent
  307.                  to "r/\\n".
  308.  
  309.  
  310.     <s>r       an r, but only in start condition s (see
  311.                below for discussion of start conditions)
  312.     <s1,s2,s3>r
  313.                same, but in any of start conditions s1,
  314.                s2, or s3
  315.  
  316.  
  317.     <<EOF>>    an end-of-file
  318.     <s1,s2><<EOF>>
  319.                an end-of-file when in start condition s1 or s2
  320.  
  321. .fi
  322. The regular expressions listed above are grouped according to
  323. precedence, from highest precedence at the top to lowest at the bottom.
  324. Those grouped together have equal precedence.  For example,
  325. .nf
  326.  
  327.     foo|bar*
  328.  
  329. .fi
  330. is the same as
  331. .nf
  332.  
  333.     (foo)|(ba(r*))
  334.  
  335. .fi
  336. since the '*' operator has higher precedence than concatenation,
  337. and concatenation higher than alternation ('|').  This pattern
  338. therefore matches
  339. .I either
  340. the string "foo"
  341. .I or
  342. the string "ba" followed by zero-or-more r's.
  343. To match "foo" or zero-or-more "bar"'s, use:
  344. .nf
  345.  
  346.     foo|(bar)*
  347.  
  348. .fi
  349. and to match zero-or-more "foo"'s-or-"bar"'s:
  350. .nf
  351.  
  352.     (foo|bar)*
  353.  
  354. .fi
  355. .LP
  356. Some notes on patterns:
  357. .IP -
  358. A negated character class such as the example "[^A-Z]"
  359. above
  360. .I will match a newline
  361. unless "\\n" (or an equivalent escape sequence) is one of the
  362. characters explicitly present in the negated character class
  363. (e.g., "[^A-Z\\n]").  This is unlike how many other regular
  364. expression tools treat negated character classes, but unfortunately
  365. the inconsistency is historically entrenched.
  366. Matching newlines means that a pattern like [^"]* can match an entire
  367. input (overflowing the scanner's input buffer) unless there's another
  368. quote in the input.
  369. .IP -
  370. A rule can have at most one instance of trailing context (the '/' operator
  371. or the '$' operator).  The start condition, '^', and "<<EOF>>" patterns
  372. can only occur at the beginning of a pattern, and, as well as with '/' and '$',
  373. cannot be grouped inside parentheses.  A '^' which does not occur at
  374. the beginning of a rule or a '$' which does not occur at the end of
  375. a rule loses its special properties and is treated as a normal character.
  376. .IP
  377. The following are illegal:
  378. .nf
  379.  
  380.     foo/bar$
  381.     <sc1>foo<sc2>bar
  382.  
  383. .fi
  384. Note that the first of these, can be written "foo/bar\\n".
  385. .IP
  386. The following will result in '$' or '^' being treated as a normal character:
  387. .nf
  388.  
  389.     foo|(bar$)
  390.     foo|^bar
  391.  
  392. .fi
  393. If what's wanted is a "foo" or a bar-followed-by-a-newline, the following
  394. could be used (the special '|' action is explained below):
  395. .nf
  396.  
  397.     foo      |
  398.     bar$     /* action goes here */
  399.  
  400. .fi
  401. A similar trick will work for matching a foo or a
  402. bar-at-the-beginning-of-a-line.
  403. .SH HOW THE INPUT IS MATCHED
  404. When the generated scanner is run, it analyzes its input looking
  405. for strings which match any of its patterns.  If it finds more than
  406. one match, it takes the one matching the most text (for trailing
  407. context rules, this includes the length of the trailing part, even
  408. though it will then be returned to the input).  If it finds two
  409. or more matches of the same length, the
  410. rule listed first in the
  411. .I flex
  412. input file is chosen.
  413. .LP
  414. Once the match is determined, the text corresponding to the match
  415. (called the
  416. .I token)
  417. is made available in the global character pointer
  418. .B yytext,
  419. and its length in the global integer
  420. .B yyleng.
  421. The
  422. .I action
  423. corresponding to the matched pattern is then executed (a more
  424. detailed description of actions follows), and then the remaining
  425. input is scanned for another match.
  426. .LP
  427. If no match is found, then the
  428. .I default rule
  429. is executed: the next character in the input is considered matched and
  430. copied to the standard output.  Thus, the simplest legal
  431. .I flex
  432. input is:
  433. .nf
  434.  
  435.     %%
  436.  
  437. .fi
  438. which generates a scanner that simply copies its input (one character
  439. at a time) to its output.
  440. .SH ACTIONS
  441. Each pattern in a rule has a corresponding action, which can be any
  442. arbitrary C statement.  The pattern ends at the first non-escaped
  443. whitespace character; the remainder of the line is its action.  If the
  444. action is empty, then when the pattern is matched the input token
  445. is simply discarded.  For example, here is the specification for a program
  446. which deletes all occurrences of "zap me" from its input:
  447. .nf
  448.  
  449.     %%
  450.     "zap me"
  451.  
  452. .fi
  453. (It will copy all other characters in the input to the output since
  454. they will be matched by the default rule.)
  455. .LP
  456. Here is a program which compresses multiple blanks and tabs down to
  457. a single blank, and throws away whitespace found at the end of a line:
  458. .nf
  459.  
  460.     %%
  461.     [ \\t]+        putchar( ' ' );
  462.     [ \\t]+$       /* ignore this token */
  463.  
  464. .fi
  465. .LP
  466. If the action contains a '{', then the action spans till the balancing '}'
  467. is found, and the action may cross multiple lines.
  468. .I flex 
  469. knows about C strings and comments and won't be fooled by braces found
  470. within them, but also allows actions to begin with
  471. .B %{
  472. and will consider the action to be all the text up to the next
  473. .B %}
  474. (regardless of ordinary braces inside the action).
  475. .LP
  476. An action consisting solely of a vertical bar ('|') means "same as
  477. the action for the next rule."  See below for an illustration.
  478. .LP
  479. Actions can include arbitrary C code, including
  480. .B return
  481. statements to return a value to whatever routine called
  482. .B yylex().
  483. Each time
  484. .B yylex()
  485. is called it continues processing tokens from where it last left
  486. off until it either reaches
  487. the end of the file or executes a return.  Once it reaches an end-of-file,
  488. however, then any subsequent call to
  489. .B yylex()
  490. will simply immediately return, unless
  491. .B yyrestart()
  492. is first called (see below).
  493. .LP
  494. Actions are not allowed to modify yytext or yyleng.
  495. .LP
  496. There are a number of special directives which can be included within
  497. an action:
  498. .IP -
  499. .B ECHO
  500. copies yytext to the scanner's output.
  501. .IP -
  502. .B BEGIN
  503. followed by the name of a start condition places the scanner in the
  504. corresponding start condition (see below).
  505. .IP -
  506. .B REJECT
  507. directs the scanner to proceed on to the "second best" rule which matched the
  508. input (or a prefix of the input).  The rule is chosen as described
  509. above in "How the Input is Matched", and
  510. .B yytext
  511. and
  512. .B yyleng
  513. set up appropriately.
  514. It may either be one which matched as much text
  515. as the originally chosen rule but came later in the
  516. .I flex
  517. input file, or one which matched less text.
  518. For example, the following will both count the
  519. words in the input and call the routine special() whenever "frob" is seen:
  520. .nf
  521.  
  522.             int word_count = 0;
  523.     %%
  524.  
  525.     frob        special(); REJECT;
  526.     [^ \\t\\n]+   ++word_count;
  527.  
  528. .fi
  529. Without the
  530. .B REJECT,
  531. any "frob"'s in the input would not be counted as words, since the
  532. scanner normally executes only one action per token.
  533. Multiple
  534. .B REJECT's
  535. are allowed, each one finding the next best choice to the currently
  536. active rule.  For example, when the following scanner scans the token
  537. "abcd", it will write "abcdabcaba" to the output:
  538. .nf
  539.  
  540.     %%
  541.     a        |
  542.     ab       |
  543.     abc      |
  544.     abcd     ECHO; REJECT;
  545.     .|\\n     /* eat up any unmatched character */
  546.  
  547. .fi
  548. (The first three rules share the fourth's action since they use
  549. the special '|' action.)
  550. .B REJECT
  551. is a particularly expensive feature in terms scanner performance;
  552. if it is used in
  553. .I any
  554. of the scanner's actions it will slow down
  555. .I all
  556. of the scanner's matching.  Furthermore,
  557. .B REJECT
  558. cannot be used with the
  559. .I -f
  560. or
  561. .I -F
  562. options (see below).
  563. .IP
  564. Note also that unlike the other special actions,
  565. .B REJECT
  566. is a
  567. .I branch;
  568. code immediately following it in the action will
  569. .I not
  570. be executed.
  571. .IP -
  572. .B yymore()
  573. tells the scanner that the next time it matches a rule, the corresponding
  574. token should be
  575. .I appended
  576. onto the current value of
  577. .B yytext
  578. rather than replacing it.  For example, given the input "mega-kludge"
  579. the following will write "mega-mega-kludge" to the output:
  580. .nf
  581.  
  582.     %%
  583.     mega-    ECHO; yymore();
  584.     kludge   ECHO;
  585.  
  586. .fi
  587. First "mega-" is matched and echoed to the output.  Then "kludge"
  588. is matched, but the previous "mega-" is still hanging around at the
  589. beginning of
  590. .B yytext
  591. so the
  592. .B ECHO
  593. for the "kludge" rule will actually write "mega-kludge".
  594. The presence of
  595. .B yymore()
  596. in the scanner's action entails a minor performance penalty in the
  597. scanner's matching speed.
  598. .IP -
  599. .B yyless(n)
  600. returns all but the first
  601. .I n
  602. characters of the current token back to the input stream, where they
  603. will be rescanned when the scanner looks for the next match.
  604. .B yytext
  605. and
  606. .B yyleng
  607. are adjusted appropriately (e.g.,
  608. .B yyleng
  609. will now be equal to
  610. .I n
  611. ).  For example, on the input "foobar" the following will write out
  612. "foobarbar":
  613. .nf
  614.  
  615.     %%
  616.     foobar    ECHO; yyless(3);
  617.     [a-z]+    ECHO;
  618.  
  619. .fi
  620. An argument of 0 to
  621. .B yyless
  622. will cause the entire current input string to be scanned again.  Unless you've
  623. changed how the scanner will subsequently process its input (using
  624. .B BEGIN,
  625. for example), this will result in an endless loop.
  626. .IP -
  627. .B unput(c)
  628. puts the character
  629. .I c
  630. back onto the input stream.  It will be the next character scanned.
  631. The following action will take the current token and cause it
  632. to be rescanned enclosed in parentheses.
  633. .nf
  634.  
  635.     {
  636.     int i;
  637.     unput( ')' );
  638.     for ( i = yyleng - 1; i >= 0; --i )
  639.         unput( yytext[i] );
  640.     unput( '(' );
  641.     }
  642.  
  643. .fi
  644. Note that since each
  645. .B unput()
  646. puts the given character back at the
  647. .I beginning
  648. of the input stream, pushing back strings must be done back-to-front.
  649. .IP -
  650. .B input()
  651. reads the next character from the input stream.  For example,
  652. the following is one way to eat up C comments:
  653. .nf
  654.  
  655.     %%
  656.     "/*"        {
  657.                 register int c;
  658.  
  659.                 for ( ; ; )
  660.                     {
  661.                     while ( (c = input()) != '*' &&
  662.                             c != EOF )
  663.                         ;    /* eat up text of comment */
  664.  
  665.                     if ( c == '*' )
  666.                         {
  667.                         while ( (c = input()) == '*' )
  668.                             ;
  669.                         if ( c == '/' )
  670.                             break;    /* found the end */
  671.                         }
  672.  
  673.                     if ( c == EOF )
  674.                         {
  675.                         error( "EOF in comment" );
  676.                         break;
  677.                         }
  678.                     }
  679.                 }
  680.  
  681. .fi
  682. (Note that if the scanner is compiled using
  683. .B C++,
  684. then
  685. .B input()
  686. is instead referred to as
  687. .B yyinput(),
  688. in order to avoid a name clash with the
  689. .B C++
  690. stream by the name of
  691. .I input.)
  692. .IP -
  693. .B yyterminate()
  694. can be used in lieu of a return statement in an action.  It terminates
  695. the scanner and returns a 0 to the scanner's caller, indicating "all done".
  696. Subsequent calls to the scanner will immediately return unless preceded
  697. by a call to
  698. .B yyrestart()
  699. (see below).
  700. By default,
  701. .B yyterminate()
  702. is also called when an end-of-file is encountered.  It is a macro and
  703. may be redefined.
  704. .SH THE GENERATED SCANNER
  705. The output of
  706. .I flex
  707. is the file
  708. .B lex.yy.c,
  709. which contains the scanning routine
  710. .B yylex(),
  711. a number of tables used by it for matching tokens, and a number
  712. of auxiliary routines and macros.  By default,
  713. .B yylex()
  714. is declared as follows:
  715. .nf
  716.  
  717.     int yylex()
  718.         {
  719.         ... various definitions and the actions in here ...
  720.         }
  721.  
  722. .fi
  723. (If your environment supports function prototypes, then it will
  724. be "int yylex( void )".)  This definition may be changed by redefining
  725. the "YY_DECL" macro.  For example, you could use:
  726. .nf
  727.  
  728.     #undef YY_DECL
  729.     #define YY_DECL float lexscan( a, b ) float a, b;
  730.  
  731. .fi
  732. to give the scanning routine the name
  733. .I lexscan,
  734. returning a float, and taking two floats as arguments.  Note that
  735. if you give arguments to the scanning routine using a
  736. K&R-style/non-prototyped function declaration, you must terminate
  737. the definition with a semi-colon (;).
  738. .LP
  739. Whenever
  740. .B yylex()
  741. is called, it scans tokens from the global input file
  742. .I yyin
  743. (which defaults to stdin).  It continues until it either reaches
  744. an end-of-file (at which point it returns the value 0) or
  745. one of its actions executes a
  746. .I return
  747. statement.
  748. In the former case, when called again the scanner will immediately
  749. return unless
  750. .B yyrestart()
  751. is called to point
  752. .I yyin
  753. at the new input file.  (
  754. .B yyrestart()
  755. takes one argument, a
  756. .B FILE *
  757. pointer.)
  758. In the latter case (i.e., when an action
  759. executes a return), the scanner may then be called again and it
  760. will resume scanning where it left off.
  761. .LP
  762. By default (and for purposes of efficiency), the scanner uses
  763. block-reads rather than simple
  764. .I getc()
  765. calls to read characters from
  766. .I yyin.
  767. The nature of how it gets its input can be controlled by redefining the
  768. .B YY_INPUT
  769. macro.
  770. YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)".  Its
  771. action is to place up to
  772. .I max_size
  773. characters in the character array
  774. .I buf
  775. and return in the integer variable
  776. .I result
  777. either the
  778. number of characters read or the constant YY_NULL (0 on Unix systems)
  779. to indicate EOF.  The default YY_INPUT reads from the
  780. global file-pointer "yyin".
  781. .LP
  782. A sample redefinition of YY_INPUT (in the definitions
  783. section of the input file):
  784. .nf
  785.  
  786.     %{
  787.     #undef YY_INPUT
  788.     #define YY_INPUT(buf,result,max_size) \\
  789.         { \\
  790.         int c = getchar(); \\
  791.         result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\
  792.         }
  793.     %}
  794.  
  795. .fi
  796. This definition will change the input processing to occur
  797. one character at a time.
  798. .LP
  799. You also can add in things like keeping track of the
  800. input line number this way; but don't expect your scanner to
  801. go very fast.
  802. .LP
  803. When the scanner receives an end-of-file indication from YY_INPUT,
  804. it then checks the
  805. .B yywrap()
  806. function.  If
  807. .B yywrap()
  808. returns false (zero), then it is assumed that the
  809. function has gone ahead and set up
  810. .I yyin
  811. to point to another input file, and scanning continues.  If it returns
  812. true (non-zero), then the scanner terminates, returning 0 to its
  813. caller.
  814. .LP
  815. The default
  816. .B yywrap()
  817. always returns 1.  Presently, to redefine it you must first
  818. "#undef yywrap", as it is currently implemented as a macro.  As indicated
  819. by the hedging in the previous sentence, it may be changed to
  820. a true function in the near future.
  821. .LP
  822. The scanner writes its
  823. .B ECHO
  824. output to the
  825. .I yyout
  826. global (default, stdout), which may be redefined by the user simply
  827. by assigning it to some other
  828. .B FILE
  829. pointer.
  830. .SH START CONDITIONS
  831. .I flex
  832. provides a mechanism for conditionally activating rules.  Any rule
  833. whose pattern is prefixed with "<sc>" will only be active when
  834. the scanner is in the start condition named "sc".  For example,
  835. .nf
  836.  
  837.     <STRING>[^"]*        { /* eat up the string body ... */
  838.                 ...
  839.                 }
  840.  
  841. .fi
  842. will be active only when the scanner is in the "STRING" start
  843. condition, and
  844. .nf
  845.  
  846.     <INITIAL,STRING,QUOTE>\\.        { /* handle an escape ... */
  847.                 ...
  848.                 }
  849.  
  850. .fi
  851. will be active only when the current start condition is
  852. either "INITIAL", "STRING", or "QUOTE".
  853. .LP
  854. Start conditions
  855. are declared in the definitions (first) section of the input
  856. using unindented lines beginning with either
  857. .B %s
  858. or
  859. .B %x
  860. followed by a list of names.
  861. The former declares
  862. .I inclusive
  863. start conditions, the latter
  864. .I exclusive
  865. start conditions.  A start condition is activated using the
  866. .B BEGIN
  867. action.  Until the next
  868. .B BEGIN
  869. action is executed, rules with the given start
  870. condition will be active and
  871. rules with other start conditions will be inactive.
  872. If the start condition is
  873. .I inclusive,
  874. then rules with no start conditions at all will also be active.
  875. If it is
  876. .I exclusive,
  877. then
  878. .I only
  879. rules qualified with the start condition will be active.
  880. A set of rules contingent on the same exclusive start condition
  881. describe a scanner which is independent of any of the other rules in the
  882. .I flex
  883. input.  Because of this,
  884. exclusive start conditions make it easy to specify "mini-scanners"
  885. which scan portions of the input that are syntactically different
  886. from the rest (e.g., comments).
  887. .LP
  888. If the distinction between inclusive and exclusive start conditions
  889. is still a little vague, here's a simple example illustrating the
  890. connection between the two.  The set of rules:
  891. .nf
  892.  
  893.     %s example
  894.     %%
  895.     <example>foo           /* do something */
  896.  
  897. .fi
  898. is equivalent to
  899. .nf
  900.  
  901.     %x example
  902.     %%
  903.     <INITIAL,example>foo   /* do something */
  904.  
  905. .fi
  906. .LP
  907. The default rule (to
  908. .B ECHO
  909. any unmatched character) remains active in start conditions.
  910. .LP
  911. .B BEGIN(0)
  912. returns to the original state where only the rules with
  913. no start conditions are active.  This state can also be
  914. referred to as the start-condition "INITIAL", so
  915. .B BEGIN(INITIAL)
  916. is equivalent to
  917. .B BEGIN(0).
  918. (The parentheses around the start condition name are not required but
  919. are considered good style.)
  920. .LP
  921. .B BEGIN
  922. actions can also be given as indented code at the beginning
  923. of the rules section.  For example, the following will cause
  924. the scanner to enter the "SPECIAL" start condition whenever
  925. .I yylex()
  926. is called and the global variable
  927. .I enter_special
  928. is true:
  929. .nf
  930.  
  931.             int enter_special;
  932.  
  933.     %x SPECIAL
  934.     %%
  935.             if ( enter_special )
  936.                 BEGIN(SPECIAL);
  937.  
  938.     <SPECIAL>blahblahblah
  939.     ...more rules follow...
  940.  
  941. .fi
  942. .LP
  943. To illustrate the uses of start conditions,
  944. here is a scanner which provides two different interpretations
  945. of a string like "123.456".  By default it will treat it as
  946. as three tokens, the integer "123", a dot ('.'), and the integer "456".
  947. But if the string is preceded earlier in the line by the string
  948. "expect-floats"
  949. it will treat it as a single token, the floating-point number
  950. 123.456:
  951. .nf
  952.  
  953.     %{
  954.     #include <math.h>
  955.     %}
  956.     %s expect
  957.  
  958.     %%
  959.     expect-floats        BEGIN(expect);
  960.  
  961.     <expect>[0-9]+"."[0-9]+      {
  962.                 printf( "found a float, = %f\\n",
  963.                         atof( yytext ) );
  964.                 }
  965.     <expect>\\n           {
  966.                 /* that's the end of the line, so
  967.                  * we need another "expect-number"
  968.                  * before we'll recognize any more
  969.                  * numbers
  970.                  */
  971.                 BEGIN(INITIAL);
  972.                 }
  973.  
  974.     [0-9]+      {
  975.                 printf( "found an integer, = %d\\n",
  976.                         atoi( yytext ) );
  977.                 }
  978.  
  979.     "."         printf( "found a dot\\n" );
  980.  
  981. .fi
  982. Here is a scanner which recognizes (and discards) C comments while
  983. maintaining a count of the current input line.
  984. .nf
  985.  
  986.     %x comment
  987.     %%
  988.             int line_num = 1;
  989.  
  990.     "/*"         BEGIN(comment);
  991.  
  992.     <comment>[^*\\n]*        /* eat anything that's not a '*' */
  993.     <comment>"*"+[^*/\\n]*   /* eat up '*'s not followed by '/'s */
  994.     <comment>\\n             ++line_num;
  995.     <comment>"*"+"/"        BEGIN(INITIAL);
  996.  
  997. .fi
  998. Note that start-conditions names are really integer values and
  999. can be stored as such.  Thus, the above could be extended in the
  1000. following fashion:
  1001. .nf
  1002.  
  1003.     %x comment foo
  1004.     %%
  1005.             int line_num = 1;
  1006.             int comment_caller;
  1007.  
  1008.     "/*"         {
  1009.                  comment_caller = INITIAL;
  1010.                  BEGIN(comment);
  1011.                  }
  1012.  
  1013.     ...
  1014.  
  1015.     <foo>"/*"    {
  1016.                  comment_caller = foo;
  1017.                  BEGIN(comment);
  1018.                  }
  1019.  
  1020.     <comment>[^*\\n]*        /* eat anything that's not a '*' */
  1021.     <comment>"*"+[^*/\\n]*   /* eat up '*'s not followed by '/'s */
  1022.     <comment>\\n             ++line_num;
  1023.     <comment>"*"+"/"        BEGIN(comment_caller);
  1024.  
  1025. .fi
  1026. One can then implement a "stack" of start conditions using an
  1027. array of integers.  (It is likely that such stacks will become
  1028. a full-fledged
  1029. .I flex
  1030. feature in the future.)  Note, though, that
  1031. start conditions do not have their own name-space; %s's and %x's
  1032. declare names in the same fashion as #define's.
  1033. .SH MULTIPLE INPUT BUFFERS
  1034. Some scanners (such as those which support "include" files)
  1035. require reading from several input streams.  As
  1036. .I flex
  1037. scanners do a large amount of buffering, one cannot control
  1038. where the next input will be read from by simply writing a
  1039. .B YY_INPUT
  1040. which is sensitive to the scanning context.
  1041. .B YY_INPUT
  1042. is only called when the scanner reaches the end of its buffer, which
  1043. may be a long time after scanning a statement such as an "include"
  1044. which requires switching the input source.
  1045. .LP
  1046. To negotiate these sorts of problems,
  1047. .I flex
  1048. provides a mechanism for creating and switching between multiple
  1049. input buffers.  An input buffer is created by using:
  1050. .nf
  1051.  
  1052.     YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
  1053.  
  1054. .fi
  1055. which takes a
  1056. .I FILE
  1057. pointer and a size and creates a buffer associated with the given
  1058. file and large enough to hold
  1059. .I size
  1060. characters (when in doubt, use
  1061. .B YY_BUF_SIZE
  1062. for the size).  It returns a
  1063. .B YY_BUFFER_STATE
  1064. handle, which may then be passed to other routines:
  1065. .nf
  1066.  
  1067.     void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
  1068.  
  1069. .fi
  1070. switches the scanner's input buffer so subsequent tokens will
  1071. come from
  1072. .I new_buffer.
  1073. Note that
  1074. .B yy_switch_to_buffer()
  1075. may be used by yywrap() to sets things up for continued scanning, instead
  1076. of opening a new file and pointing
  1077. .I yyin
  1078. at it.
  1079. .nf
  1080.  
  1081.     void yy_delete_buffer( YY_BUFFER_STATE buffer )
  1082.  
  1083. .fi
  1084. is used to reclaim the storage associated with a buffer.
  1085. .LP
  1086. .B yy_new_buffer()
  1087. is an alias for
  1088. .B yy_create_buffer(),
  1089. provided for compatibility with the C++ use of
  1090. .I new
  1091. and
  1092. .I delete
  1093. for creating and destroying dynamic objects.
  1094. .LP
  1095. Finally, the
  1096. .B YY_CURRENT_BUFFER
  1097. macro returns a
  1098. .B YY_BUFFER_STATE
  1099. handle to the current buffer.
  1100. .LP
  1101. Here is an example of using these features for writing a scanner
  1102. which expands include files (the
  1103. .B <<EOF>>
  1104. feature is discussed below):
  1105. .nf
  1106.  
  1107.     /* the "incl" state is used for picking up the name
  1108.      * of an include file
  1109.      */
  1110.     %x incl
  1111.  
  1112.     %{
  1113.     #define MAX_INCLUDE_DEPTH 10
  1114.     YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
  1115.     int include_stack_ptr = 0;
  1116.     %}
  1117.  
  1118.     %%
  1119.     include             BEGIN(incl);
  1120.  
  1121.     [a-z]+              ECHO;
  1122.     [^a-z\\n]*\\n?        ECHO;
  1123.  
  1124.     <incl>[ \\t]*      /* eat the whitespace */
  1125.     <incl>[^ \\t\\n]+   { /* got the include file name */
  1126.             if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
  1127.                 {
  1128.                 fprintf( stderr, "Includes nested too deeply" );
  1129.                 exit( 1 );
  1130.                 }
  1131.  
  1132.             include_stack[include_stack_ptr++] =
  1133.                 YY_CURRENT_BUFFER;
  1134.  
  1135.             yyin = fopen( yytext, "r" );
  1136.  
  1137.             if ( ! yyin )
  1138.                 error( ... );
  1139.  
  1140.             yy_switch_to_buffer(
  1141.                 yy_create_buffer( yyin, YY_BUF_SIZE ) );
  1142.  
  1143.             BEGIN(INITIAL);
  1144.             }
  1145.  
  1146.     <<EOF>> {
  1147.             if ( --include_stack_ptr < 0 )
  1148.                 {
  1149.                 yyterminate();
  1150.                 }
  1151.  
  1152.             else
  1153.                 yy_switch_to_buffer(
  1154.                      include_stack[include_stack_ptr] );
  1155.             }
  1156.  
  1157. .fi
  1158. .SH END-OF-FILE RULES
  1159. The special rule "<<EOF>>" indicates
  1160. actions which are to be taken when an end-of-file is
  1161. encountered and yywrap() returns non-zero (i.e., indicates
  1162. no further files to process).  The action must finish
  1163. by doing one of four things:
  1164. .IP -
  1165. the special
  1166. .B YY_NEW_FILE
  1167. action, if
  1168. .I yyin
  1169. has been pointed at a new file to process;
  1170. .IP -
  1171. a
  1172. .I return
  1173. statement;
  1174. .IP -
  1175. the special
  1176. .B yyterminate()
  1177. action;
  1178. .IP -
  1179. or, switching to a new buffer using
  1180. .B yy_switch_to_buffer()
  1181. as shown in the example above.
  1182. .LP
  1183. <<EOF>> rules may not be used with other
  1184. patterns; they may only be qualified with a list of start
  1185. conditions.  If an unqualified <<EOF>> rule is given, it
  1186. applies to
  1187. .I all
  1188. start conditions which do not already have <<EOF>> actions.  To
  1189. specify an <<EOF>> rule for only the initial start condition, use
  1190. .nf
  1191.  
  1192.     <INITIAL><<EOF>>
  1193.  
  1194. .fi
  1195. .LP
  1196. These rules are useful for catching things like unclosed comments.
  1197. An example:
  1198. .nf
  1199.  
  1200.     %x quote
  1201.     %%
  1202.  
  1203.     ...other rules for dealing with quotes...
  1204.  
  1205.     <quote><<EOF>>   {
  1206.              error( "unterminated quote" );
  1207.              yyterminate();
  1208.              }
  1209.     <<EOF>>  {
  1210.              if ( *++filelist )
  1211.                  {
  1212.                  yyin = fopen( *filelist, "r" );
  1213.                  YY_NEW_FILE;
  1214.                  }
  1215.              else
  1216.                 yyterminate();
  1217.              }
  1218.  
  1219. .fi
  1220. .SH MISCELLANEOUS MACROS
  1221. The macro
  1222. .bd
  1223. YY_USER_ACTION
  1224. can be redefined to provide an action
  1225. which is always executed prior to the matched rule's action.  For example,
  1226. it could be #define'd to call a routine to convert yytext to lower-case.
  1227. .LP
  1228. The macro
  1229. .B YY_USER_INIT
  1230. may be redefined to provide an action which is always executed before
  1231. the first scan (and before the scanner's internal initializations are done).
  1232. For example, it could be used to call a routine to read
  1233. in a data table or open a logging file.
  1234. .LP
  1235. In the generated scanner, the actions are all gathered in one large
  1236. switch statement and separated using
  1237. .B YY_BREAK,
  1238. which may be redefined.  By default, it is simply a "break", to separate
  1239. each rule's action from the following rule's.
  1240. Redefining
  1241. .B YY_BREAK
  1242. allows, for example, C++ users to
  1243. #define YY_BREAK to do nothing (while being very careful that every
  1244. rule ends with a "break" or a "return"!) to avoid suffering from
  1245. unreachable statement warnings where because a rule's action ends with
  1246. "return", the
  1247. .B YY_BREAK
  1248. is inaccessible.
  1249. .SH INTERFACING WITH YACC
  1250. One of the main uses of
  1251. .I flex
  1252. is as a companion to the
  1253. .I yacc
  1254. parser-generator.
  1255. .I yacc
  1256. parsers expect to call a routine named
  1257. .B yylex()
  1258. to find the next input token.  The routine is supposed to
  1259. return the type of the next token as well as putting any associated
  1260. value in the global
  1261. .B yylval.
  1262. To use
  1263. .I flex
  1264. with
  1265. .I yacc,
  1266. one specifies the
  1267. .B -d
  1268. option to
  1269. .I yacc
  1270. to instruct it to generate the file
  1271. .B y.tab.h
  1272. containing definitions of all the
  1273. .B %tokens
  1274. appearing in the
  1275. .I yacc
  1276. input.  This file is then included in the
  1277. .I flex
  1278. scanner.  For example, if one of the tokens is "TOK_NUMBER",
  1279. part of the scanner might look like:
  1280. .nf
  1281.  
  1282.     %{
  1283.     #include "y.tab.h"
  1284.     %}
  1285.  
  1286.     %%
  1287.  
  1288.     [0-9]+        yylval = atoi( yytext ); return TOK_NUMBER;
  1289.  
  1290. .fi
  1291. .SH TRANSLATION TABLE
  1292. In the name of POSIX compliance,
  1293. .I flex
  1294. supports a
  1295. .I translation table
  1296. for mapping input characters into groups.
  1297. The table is specified in the first section, and its format looks like:
  1298. .nf
  1299.  
  1300.     %t
  1301.     1        abcd
  1302.     2        ABCDEFGHIJKLMNOPQRSTUVWXYZ
  1303.     52       0123456789
  1304.     6        \\t\\ \\n
  1305.     %t
  1306.  
  1307. .fi
  1308. This example specifies that the characters 'a', 'b', 'c', and 'd'
  1309. are to all be lumped into group #1, upper-case letters
  1310. in group #2, digits in group #52, tabs, blanks, and newlines into
  1311. group #6, and
  1312. .I
  1313. no other characters will appear in the patterns.
  1314. The group numbers are actually disregarded by
  1315. .I flex;
  1316. .B %t
  1317. serves, though, to lump characters together.  Given the above
  1318. table, for example, the pattern "a(AA)*5" is equivalent to "d(ZQ)*0".
  1319. They both say, "match any character in group #1, followed by
  1320. zero-or-more pairs of characters
  1321. from group #2, followed by a character from group #52."  Thus
  1322. .B %t
  1323. provides a crude way for introducing equivalence classes into
  1324. the scanner specification.
  1325. .LP
  1326. Note that the
  1327. .B -i
  1328. option (see below) coupled with the equivalence classes which
  1329. .I flex
  1330. automatically generates take care of virtually all the instances
  1331. when one might consider using
  1332. .B %t.
  1333. But what the hell, it's there if you want it.
  1334. .SH OPTIONS
  1335. .I flex
  1336. has the following options:
  1337. .TP
  1338. .B -b
  1339. Generate backtracking information to
  1340. .I lex.backtrack.
  1341. This is a list of scanner states which require backtracking
  1342. and the input characters on which they do so.  By adding rules one
  1343. can remove backtracking states.  If all backtracking states
  1344. are eliminated and
  1345. .B -f
  1346. or
  1347. .B -F
  1348. is used, the generated scanner will run faster (see the
  1349. .B -p
  1350. flag).  Only users who wish to squeeze every last cycle out of their
  1351. scanners need worry about this option.  (See the section on PERFORMANCE
  1352. CONSIDERATIONS below.)
  1353. .TP
  1354. .B -c
  1355. is a do-nothing, deprecated option included for POSIX compliance.
  1356. .IP
  1357. .B NOTE:
  1358. in previous releases of
  1359. .I flex
  1360. .B -c
  1361. specified table-compression options.  This functionality is
  1362. now given by the
  1363. .B -C
  1364. flag.  To ease the the impact of this change, when
  1365. .I flex
  1366. encounters
  1367. .B -c,
  1368. it currently issues a warning message and assumes that
  1369. .B -C
  1370. was desired instead.  In the future this "promotion" of
  1371. .B -c
  1372. to
  1373. .B -C
  1374. will go away in the name of full POSIX compliance (unless
  1375. the POSIX meaning is removed first).
  1376. .TP
  1377. .B -d
  1378. makes the generated scanner run in
  1379. .I debug
  1380. mode.  Whenever a pattern is recognized and the global
  1381. .B yy_flex_debug
  1382. is non-zero (which is the default),
  1383. the scanner will write to
  1384. .I stderr
  1385. a line of the form:
  1386. .nf
  1387.  
  1388.     --accepting rule at line 53 ("the matched text")
  1389.  
  1390. .fi
  1391. The line number refers to the location of the rule in the file
  1392. defining the scanner (i.e., the file that was fed to flex).  Messages
  1393. are also generated when the scanner backtracks, accepts the
  1394. default rule, reaches the end of its input buffer (or encounters
  1395. a NUL; at this point, the two look the same as far as the scanner's concerned),
  1396. or reaches an end-of-file.
  1397. .TP
  1398. .B -f
  1399. specifies (take your pick)
  1400. .I full table
  1401. or
  1402. .I fast scanner.
  1403. No table compression is done.  The result is large but fast.
  1404. This option is equivalent to
  1405. .B -Cf
  1406. (see below).
  1407. .TP
  1408. .B -i
  1409. instructs
  1410. .I flex
  1411. to generate a
  1412. .I case-insensitive
  1413. scanner.  The case of letters given in the
  1414. .I flex
  1415. input patterns will
  1416. be ignored, and tokens in the input will be matched regardless of case.  The
  1417. matched text given in
  1418. .I yytext
  1419. will have the preserved case (i.e., it will not be folded).
  1420. .TP
  1421. .B -n
  1422. is another do-nothing, deprecated option included only for
  1423. POSIX compliance.
  1424. .TP
  1425. .B -p
  1426. generates a performance report to stderr.  The report
  1427. consists of comments regarding features of the
  1428. .I flex
  1429. input file which will cause a loss of performance in the resulting scanner.
  1430. Note that the use of
  1431. .I REJECT
  1432. and variable trailing context (see the BUGS section in flex(1))
  1433. entails a substantial performance penalty; use of
  1434. .I yymore(),
  1435. the
  1436. .B ^
  1437. operator,
  1438. and the
  1439. .B -I
  1440. flag entail minor performance penalties.
  1441. .TP
  1442. .B -s
  1443. causes the
  1444. .I default rule
  1445. (that unmatched scanner input is echoed to
  1446. .I stdout)
  1447. to be suppressed.  If the scanner encounters input that does not
  1448. match any of its rules, it aborts with an error.  This option is
  1449. useful for finding holes in a scanner's rule set.
  1450. .TP
  1451. .B -t
  1452. instructs
  1453. .I flex
  1454. to write the scanner it generates to standard output instead
  1455. of
  1456. .B lex.yy.c.
  1457. .TP
  1458. .B -v
  1459. specifies that
  1460. .I flex
  1461. should write to
  1462. .I stderr
  1463. a summary of statistics regarding the scanner it generates.
  1464. Most of the statistics are meaningless to the casual
  1465. .I flex
  1466. user, but the
  1467. first line identifies the version of
  1468. .I flex,
  1469. which is useful for figuring
  1470. out where you stand with respect to patches and new releases,
  1471. and the next two lines give the date when the scanner was created
  1472. and a summary of the flags which were in effect.
  1473. .TP
  1474. .B -F
  1475. specifies that the
  1476. .ul
  1477. fast
  1478. scanner table representation should be used.  This representation is
  1479. about as fast as the full table representation
  1480. .ul
  1481. (-f),
  1482. and for some sets of patterns will be considerably smaller (and for
  1483. others, larger).  In general, if the pattern set contains both "keywords"
  1484. and a catch-all, "identifier" rule, such as in the set:
  1485. .nf
  1486.  
  1487.     "case"    return TOK_CASE;
  1488.     "switch"  return TOK_SWITCH;
  1489.     ...
  1490.     "default" return TOK_DEFAULT;
  1491.     [a-z]+    return TOK_ID;
  1492.  
  1493. .fi
  1494. then you're better off using the full table representation.  If only
  1495. the "identifier" rule is present and you then use a hash table or some such
  1496. to detect the keywords, you're better off using
  1497. .ul
  1498. -F.
  1499. .IP
  1500. This option is equivalent to
  1501. .B -CF
  1502. (see below).
  1503. .TP
  1504. .B -I
  1505. instructs
  1506. .I flex
  1507. to generate an
  1508. .I interactive
  1509. scanner.  Normally, scanners generated by
  1510. .I flex
  1511. always look ahead one
  1512. character before deciding that a rule has been matched.  At the cost of
  1513. some scanning overhead,
  1514. .I flex
  1515. will generate a scanner which only looks ahead
  1516. when needed.  Such scanners are called
  1517. .I interactive
  1518. because if you want to write a scanner for an interactive system such as a
  1519. command shell, you will probably want the user's input to be terminated
  1520. with a newline, and without
  1521. .B -I
  1522. the user will have to type a character in addition to the newline in order
  1523. to have the newline recognized.  This leads to dreadful interactive
  1524. performance.
  1525. .IP
  1526. If all this seems to confusing, here's the general rule: if a human will
  1527. be typing in input to your scanner, use
  1528. .B -I,
  1529. otherwise don't; if you don't care about squeezing the utmost performance
  1530. from your scanner and you
  1531. don't want to make any assumptions about the input to your scanner,
  1532. use
  1533. .B -I.
  1534. .IP
  1535. Note,
  1536. .B -I
  1537. cannot be used in conjunction with
  1538. .I full
  1539. or
  1540. .I fast tables,
  1541. i.e., the
  1542. .B -f, -F, -Cf,
  1543. or
  1544. .B -CF
  1545. flags.
  1546. .TP
  1547. .B -L
  1548. instructs
  1549. .I flex
  1550. not to generate
  1551. .B #line
  1552. directives.  Without this option,
  1553. .I flex
  1554. peppers the generated scanner
  1555. with #line directives so error messages in the actions will be correctly
  1556. located with respect to the original
  1557. .I flex
  1558. input file, and not to
  1559. the fairly meaningless line numbers of
  1560. .B lex.yy.c.
  1561. (Unfortunately
  1562. .I flex
  1563. does not presently generate the necessary directives
  1564. to "retarget" the line numbers for those parts of
  1565. .B lex.yy.c
  1566. which it generated.  So if there is an error in the generated code,
  1567. a meaningless line number is reported.)
  1568. .TP
  1569. .B -T
  1570. makes
  1571. .I flex
  1572. run in
  1573. .I trace
  1574. mode.  It will generate a lot of messages to
  1575. .I stdout
  1576. concerning
  1577. the form of the input and the resultant non-deterministic and deterministic
  1578. finite automata.  This option is mostly for use in maintaining
  1579. .I flex.
  1580. .TP
  1581. .B -8
  1582. instructs
  1583. .I flex
  1584. to generate an 8-bit scanner, i.e., one which can recognize 8-bit
  1585. characters.  On some sites,
  1586. .I flex
  1587. is installed with this option as the default.  On others, the default
  1588. is 7-bit characters.  To see which is the case, check the verbose
  1589. .B (-v)
  1590. output for "equivalence classes created".  If the denominator of
  1591. the number shown is 128, then by default
  1592. .I flex
  1593. is generating 7-bit characters.  If it is 256, then the default is
  1594. 8-bit characters and the
  1595. .B -8
  1596. flag is not required (but may be a good idea to keep the scanner
  1597. specification portable).  Feeding a 7-bit scanner 8-bit characters
  1598. will result in infinite loops, bus errors, or other such fireworks,
  1599. so when in doubt, use the flag.  Note that if equivalence classes
  1600. are used, 8-bit scanners take only slightly more table space than
  1601. 7-bit scanners (128 bytes, to be exact); if equivalence classes are
  1602. not used, however, then the tables may grow up to twice their
  1603. 7-bit size.
  1604. .TP 
  1605. .B -C[efmF]
  1606. controls the degree of table compression.
  1607. .IP
  1608. .B -Ce
  1609. directs
  1610. .I flex
  1611. to construct
  1612. .I equivalence classes,
  1613. i.e., sets of characters
  1614. which have identical lexical properties (for example, if the only
  1615. appearance of digits in the
  1616. .I flex
  1617. input is in the character class
  1618. "[0-9]" then the digits '0', '1', ..., '9' will all be put
  1619. in the same equivalence class).  Equivalence classes usually give
  1620. dramatic reductions in the final table/object file sizes (typically
  1621. a factor of 2-5) and are pretty cheap performance-wise (one array
  1622. look-up per character scanned).
  1623. .IP
  1624. .B -Cf
  1625. specifies that the
  1626. .I full
  1627. scanner tables should be generated -
  1628. .I flex
  1629. should not compress the
  1630. tables by taking advantages of similar transition functions for
  1631. different states.
  1632. .IP
  1633. .B -CF
  1634. specifies that the alternate fast scanner representation (described
  1635. above under the
  1636. .B -F
  1637. flag)
  1638. should be used.
  1639. .IP
  1640. .B -Cm
  1641. directs
  1642. .I flex
  1643. to construct
  1644. .I meta-equivalence classes,
  1645. which are sets of equivalence classes (or characters, if equivalence
  1646. classes are not being used) that are commonly used together.  Meta-equivalence
  1647. classes are often a big win when using compressed tables, but they
  1648. have a moderate performance impact (one or two "if" tests and one
  1649. array look-up per character scanned).
  1650. .IP
  1651. A lone
  1652. .B -C
  1653. specifies that the scanner tables should be compressed but neither
  1654. equivalence classes nor meta-equivalence classes should be used.
  1655. .IP
  1656. The options
  1657. .B -Cf
  1658. or
  1659. .B -CF
  1660. and
  1661. .B -Cm
  1662. do not make sense together - there is no opportunity for meta-equivalence
  1663. classes if the table is not being compressed.  Otherwise the options
  1664. may be freely mixed.
  1665. .IP
  1666. The default setting is
  1667. .B -Cem,
  1668. which specifies that
  1669. .I flex
  1670. should generate equivalence classes
  1671. and meta-equivalence classes.  This setting provides the highest
  1672. degree of table compression.  You can trade off
  1673. faster-executing scanners at the cost of larger tables with
  1674. the following generally being true:
  1675. .nf
  1676.  
  1677.     slowest & smallest
  1678.           -Cem
  1679.           -Cm
  1680.           -Ce
  1681.           -C
  1682.           -C{f,F}e
  1683.           -C{f,F}
  1684.     fastest & largest
  1685.  
  1686. .fi
  1687. Note that scanners with the smallest tables are usually generated and
  1688. compiled the quickest, so
  1689. during development you will usually want to use the default, maximal
  1690. compression.
  1691. .IP
  1692. .B -Cfe
  1693. is often a good compromise between speed and size for production
  1694. scanners.
  1695. .IP
  1696. .B -C
  1697. options are not cumulative; whenever the flag is encountered, the
  1698. previous -C settings are forgotten.
  1699. .TP
  1700. .B -Sskeleton_file
  1701. overrides the default skeleton file from which
  1702. .I flex
  1703. constructs its scanners.  You'll never need this option unless you are doing
  1704. .I flex
  1705. maintenance or development.
  1706. .SH PERFORMANCE CONSIDERATIONS
  1707. The main design goal of
  1708. .I flex
  1709. is that it generate high-performance scanners.  It has been optimized
  1710. for dealing well with large sets of rules.  Aside from the effects
  1711. of table compression on scanner speed outlined above,
  1712. there are a number of options/actions which degrade performance.  These
  1713. are, from most expensive to least:
  1714. .nf
  1715.  
  1716.     REJECT
  1717.  
  1718.     pattern sets that require backtracking
  1719.     arbitrary trailing context
  1720.  
  1721.     '^' beginning-of-line operator
  1722.     yymore()
  1723.  
  1724. .fi
  1725. with the first three all being quite expensive and the last two
  1726. being quite cheap.
  1727. .LP
  1728. .B REJECT
  1729. should be avoided at all costs when performance is important.
  1730. It is a particularly expensive option.
  1731. .LP
  1732. Getting rid of backtracking is messy and often may be an enormous
  1733. amount of work for a complicated scanner.  In principal, one begins
  1734. by using the
  1735. .B -b 
  1736. flag to generate a
  1737. .I lex.backtrack
  1738. file.  For example, on the input
  1739. .nf
  1740.  
  1741.     %%
  1742.     foo        return TOK_KEYWORD;
  1743.     foobar     return TOK_KEYWORD;
  1744.  
  1745. .fi
  1746. the file looks like:
  1747. .nf
  1748.  
  1749.     State #6 is non-accepting -
  1750.      associated rule line numbers:
  1751.            2       3
  1752.      out-transitions: [ o ]
  1753.      jam-transitions: EOF [ \\001-n  p-\\177 ]
  1754.  
  1755.     State #8 is non-accepting -
  1756.      associated rule line numbers:
  1757.            3
  1758.      out-transitions: [ a ]
  1759.      jam-transitions: EOF [ \\001-`  b-\\177 ]
  1760.  
  1761.     State #9 is non-accepting -
  1762.      associated rule line numbers:
  1763.            3
  1764.      out-transitions: [ r ]
  1765.      jam-transitions: EOF [ \\001-q  s-\\177 ]
  1766.  
  1767.     Compressed tables always backtrack.
  1768.  
  1769. .fi
  1770. The first few lines tell us that there's a scanner state in
  1771. which it can make a transition on an 'o' but not on any other
  1772. character, and that in that state the currently scanned text does not match
  1773. any rule.  The state occurs when trying to match the rules found
  1774. at lines 2 and 3 in the input file.
  1775. If the scanner is in that state and then reads
  1776. something other than an 'o', it will have to backtrack to find
  1777. a rule which is matched.  With
  1778. a bit of headscratching one can see that this must be the
  1779. state it's in when it has seen "fo".  When this has happened,
  1780. if anything other than another 'o' is seen, the scanner will
  1781. have to back up to simply match the 'f' (by the default rule).
  1782. .LP
  1783. The comment regarding State #8 indicates there's a problem
  1784. when "foob" has been scanned.  Indeed, on any character other
  1785. than a 'b', the scanner will have to back up to accept "foo".
  1786. Similarly, the comment for State #9 concerns when "fooba" has
  1787. been scanned.
  1788. .LP
  1789. The final comment reminds us that there's no point going to
  1790. all the trouble of removing backtracking from the rules unless
  1791. we're using
  1792. .B -f
  1793. or
  1794. .B -F,
  1795. since there's no performance gain doing so with compressed scanners.
  1796. .LP
  1797. The way to remove the backtracking is to add "error" rules:
  1798. .nf
  1799.  
  1800.     %%
  1801.     foo         return TOK_KEYWORD;
  1802.     foobar      return TOK_KEYWORD;
  1803.  
  1804.     fooba       |
  1805.     foob        |
  1806.     fo          {
  1807.                 /* false alarm, not really a keyword */
  1808.                 return TOK_ID;
  1809.                 }
  1810.  
  1811. .fi
  1812. .LP
  1813. Eliminating backtracking among a list of keywords can also be
  1814. done using a "catch-all" rule:
  1815. .nf
  1816.  
  1817.     %%
  1818.     foo         return TOK_KEYWORD;
  1819.     foobar      return TOK_KEYWORD;
  1820.  
  1821.     [a-z]+      return TOK_ID;
  1822.  
  1823. .fi
  1824. This is usually the best solution when appropriate.
  1825. .LP
  1826. Backtracking messages tend to cascade.
  1827. With a complicated set of rules it's not uncommon to get hundreds
  1828. of messages.  If one can decipher them, though, it often
  1829. only takes a dozen or so rules to eliminate the backtracking (though
  1830. it's easy to make a mistake and have an error rule accidentally match
  1831. a valid token.  A possible future
  1832. .I flex
  1833. feature will be to automatically add rules to eliminate backtracking).
  1834. .LP
  1835. .I Variable
  1836. trailing context (where both the leading and trailing parts do not have
  1837. a fixed length) entails almost the same performance loss as
  1838. .I REJECT
  1839. (i.e., substantial).  So when possible a rule like:
  1840. .nf
  1841.  
  1842.     %%
  1843.     mouse|rat/(cat|dog)   run();
  1844.  
  1845. .fi
  1846. is better written:
  1847. .nf
  1848.  
  1849.     %%
  1850.     mouse/cat|dog         run();
  1851.     rat/cat|dog           run();
  1852.  
  1853. .fi
  1854. or as
  1855. .nf
  1856.  
  1857.     %%
  1858.     mouse|rat/cat         run();
  1859.     mouse|rat/dog         run();
  1860.  
  1861. .fi
  1862. Note that here the special '|' action does
  1863. .I not
  1864. provide any savings, and can even make things worse (see
  1865. .B BUGS
  1866. in flex(1)).
  1867. .LP
  1868. Another area where the user can increase a scanner's performance
  1869. (and one that's easier to implement) arises from the fact that
  1870. the longer the tokens matched, the faster the scanner will run.
  1871. This is because with long tokens the processing of most input
  1872. characters takes place in the (short) inner scanning loop, and
  1873. does not often have to go through the additional work of setting up
  1874. the scanning environment (e.g.,
  1875. .B yytext)
  1876. for the action.  Recall the scanner for C comments:
  1877. .nf
  1878.  
  1879.     %x comment
  1880.     %%
  1881.             int line_num = 1;
  1882.  
  1883.     "/*"         BEGIN(comment);
  1884.  
  1885.     <comment>[^*\\n]*
  1886.     <comment>"*"+[^*/\\n]*
  1887.     <comment>\\n             ++line_num;
  1888.     <comment>"*"+"/"        BEGIN(INITIAL);
  1889.  
  1890. .fi
  1891. This could be sped up by writing it as:
  1892. .nf
  1893.  
  1894.     %x comment
  1895.     %%
  1896.             int line_num = 1;
  1897.  
  1898.     "/*"         BEGIN(comment);
  1899.  
  1900.     <comment>[^*\\n]*
  1901.     <comment>[^*\\n]*\\n      ++line_num;
  1902.     <comment>"*"+[^*/\\n]*
  1903.     <comment>"*"+[^*/\\n]*\\n ++line_num;
  1904.     <comment>"*"+"/"        BEGIN(INITIAL);
  1905.  
  1906. .fi
  1907. Now instead of each newline requiring the processing of another
  1908. action, recognizing the newlines is "distributed" over the other rules
  1909. to keep the matched text as long as possible.  Note that
  1910. .I adding
  1911. rules does
  1912. .I not
  1913. slow down the scanner!  The speed of the scanner is independent
  1914. of the number of rules or (modulo the considerations given at the
  1915. beginning of this section) how complicated the rules are with
  1916. regard to operators such as '*' and '|'.
  1917. .LP
  1918. A final example in speeding up a scanner: suppose you want to scan
  1919. through a file containing identifiers and keywords, one per line
  1920. and with no other extraneous characters, and recognize all the
  1921. keywords.  A natural first approach is:
  1922. .nf
  1923.  
  1924.     %%
  1925.     asm      |
  1926.     auto     |
  1927.     break    |
  1928.     ... etc ...
  1929.     volatile |
  1930.     while    /* it's a keyword */
  1931.  
  1932.     .|\\n     /* it's not a keyword */
  1933.  
  1934. .fi
  1935. To eliminate the back-tracking, introduce a catch-all rule:
  1936. .nf
  1937.  
  1938.     %%
  1939.     asm      |
  1940.     auto     |
  1941.     break    |
  1942.     ... etc ...
  1943.     volatile |
  1944.     while    /* it's a keyword */
  1945.  
  1946.     [a-z]+   |
  1947.     .|\\n     /* it's not a keyword */
  1948.  
  1949. .fi
  1950. Now, if it's guaranteed that there's exactly one word per line,
  1951. then we can reduce the total number of matches by a half by
  1952. merging in the recognition of newlines with that of the other
  1953. tokens:
  1954. .nf
  1955.  
  1956.     %%
  1957.     asm\\n    |
  1958.     auto\\n   |
  1959.     break\\n  |
  1960.     ... etc ...
  1961.     volatile\\n |
  1962.     while\\n  /* it's a keyword */
  1963.  
  1964.     [a-z]+\\n |
  1965.     .|\\n     /* it's not a keyword */
  1966.  
  1967. .fi
  1968. One has to be careful here, as we have now reintroduced backtracking
  1969. into the scanner.  In particular, while
  1970. .I we
  1971. know that there will never be any characters in the input stream
  1972. other than letters or newlines,
  1973. .I flex
  1974. can't figure this out, and it will plan for possibly needing backtracking
  1975. when it has scanned a token like "auto" and then the next character
  1976. is something other than a newline or a letter.  Previously it would
  1977. then just match the "auto" rule and be done, but now it has no "auto"
  1978. rule, only a "auto\\n" rule.  To eliminate the possibility of backtracking,
  1979. we could either duplicate all rules but without final newlines, or,
  1980. since we never expect to encounter such an input and therefore don't
  1981. how it's classified, we can introduce one more catch-all rule, this
  1982. one which doesn't include a newline:
  1983. .nf
  1984.  
  1985.     %%
  1986.     asm\\n    |
  1987.     auto\\n   |
  1988.     break\\n  |
  1989.     ... etc ...
  1990.     volatile\\n |
  1991.     while\\n  /* it's a keyword */
  1992.  
  1993.     [a-z]+\\n |
  1994.     [a-z]+   |
  1995.     .|\\n     /* it's not a keyword */
  1996.  
  1997. .fi
  1998. Compiled with
  1999. .B -Cf,
  2000. this is about as fast as one can get a
  2001. .I flex 
  2002. scanner to go for this particular problem.
  2003. .LP
  2004. A final note:
  2005. .I flex
  2006. is slow when matching NUL's, particularly when a token contains
  2007. multiple NUL's.
  2008. It's best to write rules which match
  2009. .I short
  2010. amounts of text if it's anticipated that the text will often include NUL's.
  2011. .SH INCOMPATIBILITIES WITH LEX AND POSIX
  2012. .I flex
  2013. is a rewrite of the Unix
  2014. .I lex
  2015. tool (the two implementations do not share any code, though),
  2016. with some extensions and incompatibilities, both of which
  2017. are of concern to those who wish to write scanners acceptable
  2018. to either implementation.  At present, the POSIX
  2019. .I lex
  2020. draft is
  2021. very close to the original
  2022. .I lex
  2023. implementation, so some of these
  2024. incompatibilities are also in conflict with the POSIX draft.  But
  2025. the intent is that except as noted below,
  2026. .I flex
  2027. as it presently stands will
  2028. ultimately be POSIX conformant (i.e., that those areas of conflict with
  2029. the POSIX draft will be resolved in
  2030. .I flex's
  2031. favor).  Please bear in
  2032. mind that all the comments which follow are with regard to the POSIX
  2033. .I draft
  2034. standard of Summer 1989, and not the final document (or subsequent
  2035. drafts); they are included so
  2036. .I flex
  2037. users can be aware of the standardization issues and those areas where
  2038. .I flex
  2039. may in the near future undergo changes incompatible with
  2040. its current definition.
  2041. .LP
  2042. .I flex
  2043. is fully compatible with
  2044. .I lex
  2045. with the following exceptions:
  2046. .IP -
  2047. The undocumented
  2048. .I lex
  2049. scanner internal variable
  2050. .B yylineno
  2051. is not supported.  It is difficult to support this option efficiently,
  2052. since it requires examining every character scanned and reexamining
  2053. the characters when the scanner backs up.
  2054. Things get more complicated when the end of buffer or file is reached or a
  2055. NUL is scanned (since the scan must then be restarted with the proper line
  2056. number count), or the user uses the yyless(), unput(), or REJECT actions,
  2057. or the multiple input buffer functions.
  2058. .IP
  2059. The fix is to add rules which, upon seeing a newline, increment
  2060. yylineno.  This is usually an easy process, though it can be a drag if some
  2061. of the patterns can match multiple newlines along with other characters.
  2062. .IP
  2063. yylineno is not part of the POSIX draft.
  2064. .IP -
  2065. The
  2066. .B input()
  2067. routine is not redefinable, though it may be called to read characters
  2068. following whatever has been matched by a rule.  If
  2069. .B input()
  2070. encounters an end-of-file the normal
  2071. .B yywrap()
  2072. processing is done.  A ``real'' end-of-file is returned by
  2073. .B input()
  2074. as
  2075. .I EOF.
  2076. .IP
  2077. Input is instead controlled by redefining the
  2078. .B YY_INPUT
  2079. macro.
  2080. .IP
  2081. The
  2082. .I flex
  2083. restriction that
  2084. .B input()
  2085. cannot be redefined is in accordance with the POSIX draft, but
  2086. .B YY_INPUT
  2087. has not yet been accepted into the draft (and probably won't; it looks
  2088. like the draft will simply not specify any way of controlling the
  2089. scanner's input other than by making an initial assignment to
  2090. .I yyin).
  2091. .IP -
  2092. .I flex
  2093. scanners do not use stdio for input.  Because of this, when writing an
  2094. interactive scanner one must explicitly call fflush() on the
  2095. stream associated with the terminal after writing out a prompt.
  2096. With
  2097. .I lex
  2098. such writes are automatically flushed since
  2099. .I lex
  2100. scanners use
  2101. .B getchar()
  2102. for their input.  Also, when writing interactive scanners with
  2103. .I flex,
  2104. the
  2105. .B -I
  2106. flag must be used.
  2107. .IP -
  2108. .I flex
  2109. scanners are not as reentrant as
  2110. .I lex
  2111. scanners.  In particular, if you have an interactive scanner and
  2112. an interrupt handler which long-jumps out of the scanner, and
  2113. the scanner is subsequently called again, you may get the following
  2114. message:
  2115. .nf
  2116.  
  2117.     fatal flex scanner internal error--end of buffer missed
  2118.  
  2119. .fi
  2120. To reenter the scanner, first use
  2121. .nf
  2122.  
  2123.     yyrestart( yyin );
  2124.  
  2125. .fi
  2126. .IP -
  2127. .B output()
  2128. is not supported.
  2129. Output from the
  2130. .B ECHO
  2131. macro is done to the file-pointer
  2132. .I yyout
  2133. (default
  2134. .I stdout).
  2135. .IP
  2136. The POSIX draft mentions that an
  2137. .B output()
  2138. routine exists but currently gives no details as to what it does.
  2139. .IP -
  2140. .I lex
  2141. does not support exclusive start conditions (%x), though they
  2142. are in the current POSIX draft.
  2143. .IP -
  2144. When definitions are expanded,
  2145. .I flex
  2146. encloses them in parentheses.
  2147. With lex, the following:
  2148. .nf
  2149.  
  2150.     NAME    [A-Z][A-Z0-9]*
  2151.     %%
  2152.     foo{NAME}?      printf( "Found it\\n" );
  2153.     %%
  2154.  
  2155. .fi
  2156. will not match the string "foo" because when the macro
  2157. is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?"
  2158. and the precedence is such that the '?' is associated with
  2159. "[A-Z0-9]*".  With
  2160. .I flex,
  2161. the rule will be expanded to
  2162. "foo([A-Z][A-Z0-9]*)?" and so the string "foo" will match.
  2163. Note that because of this, the
  2164. .B ^, $, <s>, /,
  2165. and
  2166. .B <<EOF>>
  2167. operators cannot be used in a
  2168. .I flex
  2169. definition.
  2170. .IP
  2171. The POSIX draft interpretation is the same as
  2172. .I flex's.
  2173. .IP -
  2174. To specify a character class which matches anything but a left bracket (']'),
  2175. in
  2176. .I lex
  2177. one can use "[^]]" but with
  2178. .I flex
  2179. one must use "[^\\]]".  The latter works with
  2180. .I lex,
  2181. too.
  2182. .IP -
  2183. The
  2184. .I lex
  2185. .B %r
  2186. (generate a Ratfor scanner) option is not supported.  It is not part
  2187. of the POSIX draft.
  2188. .IP -
  2189. If you are providing your own yywrap() routine, you must include a
  2190. "#undef yywrap" in the definitions section (section 1).  Note that
  2191. the "#undef" will have to be enclosed in %{}'s.
  2192. .IP
  2193. The POSIX draft
  2194. specifies that yywrap() is a function and this is very unlikely to change; so
  2195. .I flex users are warned
  2196. that
  2197. .B yywrap()
  2198. is likely to be changed to a function in the near future.
  2199. .IP -
  2200. After a call to
  2201. .B unput(),
  2202. .I yytext
  2203. and
  2204. .I yyleng
  2205. are undefined until the next token is matched.  This is not the case with
  2206. .I lex
  2207. or the present POSIX draft.
  2208. .IP -
  2209. The precedence of the
  2210. .B {}
  2211. (numeric range) operator is different.
  2212. .I lex
  2213. interprets "abc{1,3}" as "match one, two, or
  2214. three occurrences of 'abc'", whereas
  2215. .I flex
  2216. interprets it as "match 'ab'
  2217. followed by one, two, or three occurrences of 'c'".  The latter is
  2218. in agreement with the current POSIX draft.
  2219. .IP -
  2220. The precedence of the
  2221. .B ^
  2222. operator is different.
  2223. .I lex
  2224. interprets "^foo|bar" as "match either 'foo' at the beginning of a line,
  2225. or 'bar' anywhere", whereas
  2226. .I flex
  2227. interprets it as "match either 'foo' or 'bar' if they come at the beginning
  2228. of a line".  The latter is in agreement with the current POSIX draft.
  2229. .IP -
  2230. To refer to yytext outside of the scanner source file,
  2231. the correct definition with
  2232. .I flex
  2233. is "extern char *yytext" rather than "extern char yytext[]".
  2234. This is contrary to the current POSIX draft but a point on which
  2235. .I flex
  2236. will not be changing, as the array representation entails a
  2237. serious performance penalty.  It is hoped that the POSIX draft will
  2238. be emended to support the
  2239. .I flex
  2240. variety of declaration (as this is a fairly painless change to
  2241. require of
  2242. .I lex
  2243. users).
  2244. .IP -
  2245. .I yyin
  2246. is
  2247. .I initialized
  2248. by
  2249. .I lex
  2250. to be
  2251. .I stdin;
  2252. .I flex,
  2253. on the other hand,
  2254. initializes
  2255. .I yyin
  2256. to NULL
  2257. and then
  2258. .I assigns
  2259. it to
  2260. .I stdin
  2261. the first time the scanner is called, providing
  2262. .I yyin
  2263. has not already been assigned to a non-NULL value.  The difference is
  2264. subtle, but the net effect is that with
  2265. .I flex
  2266. scanners,
  2267. .I yyin
  2268. does not have a valid value until the scanner has been called.
  2269. .IP -
  2270. The special table-size declarations such as
  2271. .B %a
  2272. supported by
  2273. .I lex
  2274. are not required by
  2275. .I flex
  2276. scanners;
  2277. .I flex
  2278. ignores them.
  2279. .IP -
  2280. The name
  2281. .bd
  2282. FLEX_SCANNER
  2283. is #define'd so scanners may be written for use with either
  2284. .I flex
  2285. or
  2286. .I lex.
  2287. .LP
  2288. The following
  2289. .I flex
  2290. features are not included in
  2291. .I lex
  2292. or the POSIX draft standard:
  2293. .nf
  2294.  
  2295.     yyterminate()
  2296.     <<EOF>>
  2297.     YY_DECL
  2298.     #line directives
  2299.     %{}'s around actions
  2300.     yyrestart()
  2301.     comments beginning with '#' (deprecated)
  2302.     multiple actions on a line
  2303.  
  2304. .fi
  2305. This last feature refers to the fact that with
  2306. .I flex
  2307. you can put multiple actions on the same line, separated with
  2308. semi-colons, while with
  2309. .I lex,
  2310. the following
  2311. .nf
  2312.  
  2313.     foo    handle_foo(); ++num_foos_seen;
  2314.  
  2315. .fi
  2316. is (rather surprisingly) truncated to
  2317. .nf
  2318.  
  2319.     foo    handle_foo();
  2320.  
  2321. .fi
  2322. .I flex
  2323. does not truncate the action.  Actions that are not enclosed in
  2324. braces are simply terminated at the end of the line.
  2325. .SH DIAGNOSTICS
  2326. .I reject_used_but_not_detected undefined
  2327. or
  2328. .I yymore_used_but_not_detected undefined -
  2329. These errors can occur at compile time.  They indicate that the
  2330. scanner uses
  2331. .B REJECT
  2332. or
  2333. .B yymore()
  2334. but that
  2335. .I flex
  2336. failed to notice the fact, meaning that
  2337. .I flex
  2338. scanned the first two sections looking for occurrences of these actions
  2339. and failed to find any, but somehow you snuck some in (via a #include
  2340. file, for example).  Make an explicit reference to the action in your
  2341. .I flex
  2342. input file.  (Note that previously
  2343. .I flex
  2344. supported a
  2345. .B %used/%unused
  2346. mechanism for dealing with this problem; this feature is still supported
  2347. but now deprecated, and will go away soon unless the author hears from
  2348. people who can argue compellingly that they need it.)
  2349. .LP
  2350. .I flex scanner jammed -
  2351. a scanner compiled with
  2352. .B -s
  2353. has encountered an input string which wasn't matched by
  2354. any of its rules.
  2355. .LP
  2356. .I flex input buffer overflowed -
  2357. a scanner rule matched a string long enough to overflow the
  2358. scanner's internal input buffer (16K bytes by default - controlled by
  2359. .B YY_BUF_SIZE
  2360. in "flex.skel".  Note that to redefine this macro, you must first
  2361. .B #undefine
  2362. it).
  2363. .LP
  2364. .I scanner requires -8 flag -
  2365. Your scanner specification includes recognizing 8-bit characters and
  2366. you did not specify the -8 flag (and your site has not installed flex
  2367. with -8 as the default).
  2368. .LP
  2369. .I
  2370. fatal flex scanner internal error--end of buffer missed -
  2371. This can occur in an scanner which is reentered after a long-jump
  2372. has jumped out (or over) the scanner's activation frame.  Before
  2373. reentering the scanner, use:
  2374. .nf
  2375.  
  2376.     yyrestart( yyin );
  2377.  
  2378. .fi
  2379. .LP
  2380. .I too many %t classes! -
  2381. You managed to put every single character into its own %t class.
  2382. .I flex
  2383. requires that at least one of the classes share characters.
  2384. .SH DEFICIENCIES / BUGS
  2385. See flex(1).
  2386. .SH "SEE ALSO"
  2387. .LP
  2388. flex(1), lex(1), yacc(1), sed(1), awk(1).
  2389. .LP
  2390. M. E. Lesk and E. Schmidt,
  2391. .I LEX - Lexical Analyzer Generator
  2392. .SH AUTHOR
  2393. Vern Paxson, with the help of many ideas and much inspiration from
  2394. Van Jacobson.  Original version by Jef Poskanzer.  The fast table
  2395. representation is a partial implementation of a design done by Van
  2396. Jacobson.  The implementation was done by Kevin Gong and Vern Paxson.
  2397. .LP
  2398. Thanks to the many
  2399. .I flex
  2400. beta-testers, feedbackers, and contributors, especially Casey
  2401. Leedom, benson@odi.com, Keith Bostic,
  2402. Frederic Brehm, Nick Christopher, Jason Coughlin,
  2403. Scott David Daniels, Leo Eskin,
  2404. Chris Faylor, Eric Goldman, Eric
  2405. Hughes, Jeffrey R. Jones, Kevin B. Kenny, Ronald Lamprecht,
  2406. Greg Lee, Craig Leres, Mohamed el Lozy, Jim Meyering, Marc Nozell, Esmond Pitt,
  2407. Jef Poskanzer, Jim Roskind,
  2408. Dave Tallman, Frank Whaley, Ken Yap, and those whose names
  2409. have slipped my marginal mail-archiving skills but whose contributions
  2410. are appreciated all the same.
  2411. .LP
  2412. Thanks to Keith Bostic, John Gilmore, Craig Leres, Bob
  2413. Mulcahy, Rich Salz, and Richard Stallman for help with various distribution
  2414. headaches.
  2415. .LP
  2416. Thanks to Esmond Pitt and Earle Horton for 8-bit character support;
  2417. to Benson Margulies and Fred
  2418. Burke for C++ support; to Ove Ewerlid for the basics of support for
  2419. NUL's; and to Eric Hughes for the basics of support for multiple buffers.
  2420. .LP
  2421. Work is being done on extending
  2422. .I flex
  2423. to generate scanners in which the
  2424. state machine is directly represented in C code rather than tables.
  2425. These scanners may well be substantially faster than those generated
  2426. using -f or -F.  If you are working in this area and are interested
  2427. in comparing notes and seeing whether redundant work can be avoided,
  2428. contact Ove Ewerlid (ewerlid@mizar.DoCS.UU.SE).
  2429. .LP
  2430. This work was primarily done when I was at the Real Time Systems Group
  2431. at the Lawrence Berkeley Laboratory in Berkeley, CA.  Many thanks to all there
  2432. for the support I received.
  2433. .LP
  2434. Send comments to:
  2435. .nf
  2436.  
  2437.      Vern Paxson
  2438.      Computer Science Department
  2439.      4126 Upson Hall
  2440.      Cornell University
  2441.      Ithaca, NY 14853-7501
  2442.  
  2443.      vern@cs.cornell.edu
  2444.      decvax!cornell!vern
  2445.  
  2446. .fi
  2447.